#include <REGX52.H>
#include "LCD1602.h"
#include "DS1302.h"
#include "Key.h"
#include "Timer0.h"

unsigned char Keynum,MODE,TimeSetSelect,TimeSetFlashFlag;

void TimeShow()
{
	DS1302_TimeShow();
	LCD_ShowNum(1,1,Timer[0],2);
	LCD_ShowNum(1,4,Timer[1],2);
	LCD_ShowNum(1,7,Timer[2],2);
	LCD_ShowNum(2,1,Timer[3],2);
	LCD_ShowNum(2,4,Timer[4],2);
	LCD_ShowNum(2,7,Timer[5],2);
}

void TimeSet()
{
	if(Keynum == 2)//按键2就是选择6个哪一个调整
	{
		TimeSetSelect++;//设置选择位加1
		TimeSetSelect%=6;//越界清零
	}
	if( Keynum == 3 )
	{
		Timer[TimeSetSelect]++;
		if(Timer[0]>99){Timer[0]=0;}//年越界判断
		if(Timer[1]>12){Timer[1]=1;}//月越界判断
		if( Timer[1]==1 || Timer[1]==3 || Timer[1]==5 || Timer[1]==7 || 
			Timer[1]==8 || Timer[1]==10 || Timer[1]==12)//日越界判断
		{
			if(Timer[2]>31){Timer[2]=1;}//大月
		}
		else if(Timer[1]==4 || Timer[1]==6 || Timer[1]==9 || Timer[1]==11)
		{
			if(Timer[2]>30){Timer[2]=1;}//小月
		}
		else if(Timer[1]==2)
		{
			if(Timer[0]%4==0)
			{
				if(Timer[2]>29){Timer[2]=1;}//闰年2月
			}
			else
			{
				if(Timer[2]>28){Timer[2]=1;}//平年2月
			}
		}
		if(Timer[3]>23){Timer[3]=0;}//时越界判断
		if(Timer[4]>59){Timer[4]=0;}//分越界判断
		if(Timer[5]>59){Timer[5]=0;}//秒越界判断
	}
	if( Keynum == 4 )
	{
		Timer[TimeSetSelect]--;//时间设置位数值减1
		if(Timer[0]<0){Timer[0]=99;}//年越界判断
		if(Timer[1]<1){Timer[1]=12;}//月越界判断
		if( Timer[1]==1 || Timer[1]==3 || Timer[1]==5 || Timer[1]==7 || 
			Timer[1]==8 || Timer[1]==10 || Timer[1]==12)//日越界判断
		{
			if(Timer[2]<1){Timer[2]=31;}//大月
			if(Timer[2]>31){Timer[2]=1;}
		}
		else if(Timer[1]==4 || Timer[1]==6 || Timer[1]==9 || Timer[1]==11)
		{
			if(Timer[2]<1){Timer[2]=30;}//小月
			if(Timer[2]>30){Timer[2]=1;}
		}
		else if(Timer[1]==2)
		{
			if(Timer[0]%4==0)
			{
				if(Timer[2]<1){Timer[2]=29;}//闰年2月
				if(Timer[2]>29){Timer[2]=1;}
			}
			else
			{
				if(Timer[2]<1){Timer[2]=28;}//平年2月
				if(Timer[2]>28){Timer[2]=1;}
			}
		}
		if(Timer[3]<0){Timer[3]=23;}//时越界判断
		if(Timer[4]<0){Timer[4]=59;}//分越界判断
		if(Timer[5]<0){Timer[5]=59;}//秒越界判断
	}
	//更新显示，根据TimeSetSelect和TimeSetFlashFlag判断可完成闪烁功能
	if(TimeSetSelect==0 && TimeSetFlashFlag==1){LCD_ShowString(1,1,"  ");}
	else {LCD_ShowNum(1,1,Timer[0],2);}
	if(TimeSetSelect==1 && TimeSetFlashFlag==1){LCD_ShowString(1,4,"  ");}
	else {LCD_ShowNum(1,4,Timer[1],2);}
	if(TimeSetSelect==2 && TimeSetFlashFlag==1){LCD_ShowString(1,7,"  ");}
	else {LCD_ShowNum(1,7,Timer[2],2);}
	if(TimeSetSelect==3 && TimeSetFlashFlag==1){LCD_ShowString(2,1,"  ");}
	else {LCD_ShowNum(2,1,Timer[3],2);}
	if(TimeSetSelect==4 && TimeSetFlashFlag==1){LCD_ShowString(2,4,"  ");}
	else {LCD_ShowNum(2,4,Timer[4],2);}
	if(TimeSetSelect==5 && TimeSetFlashFlag==1){LCD_ShowString(2,7,"  ");}
	else {LCD_ShowNum(2,7,Timer[5],2);}
}

void main()
{
	
	LCD_Init();
	DS1302_Init();
	Timer0_Init();
	LCD_ShowString(1,1,"  -  -  ");//静态字符初始化显示
	LCD_ShowString(2,1,"  :  :  ");
	
/* 读写测试，你写入的时候是按照16进制写进去的，但是时钟表示的方式是以 BCD码的方式显示的，就是4位2进制，表示一位十进制，，所以存在转换
DS1602_WriteByte(DS1302_WP,0x00);
DS1602_WriteByte(0x80,0x03);//所以这里计数到9的时候，他就会从9变成16 0000 1001，因为他不会显示10，只有0~9，所以他9进位，就是 0001 0000，就是16
DS1602_WriteByte(DS1302_WP,0x80);
	while(1)
	{
		sex = DS1602_ReadByte(0x80);
		LCD_ShowNum(2,1,sex,3);
	}
}
*/
	DS1302_TimeSet();
	while(1)
	{ 
		Keynum = keynumber();
		if(Keynum == 1)
		{    //用mode来控制进入的程序，如果按下1，mode等于0，代表他本来就是显示，就要变成调试，所以置1，然后进去case里面去
			if(MODE == 0){MODE=1;TimeSetSelect=0;}//功能切换
			else if(MODE==1){MODE = 0;DS1302_TimeSet();}
		}
		switch(MODE)
		{
			case 0:TimeShow();break;
			case 1:TimeSet();break;
		}
	}
}

void Timer0_Rountine() interrupt 1 //这个是中断号，就是相当于是你T0发生中断了，就会跳到这个地方来，interrupt 1就是T0的中断号，前面的名字是自己取的
{
	static unsigned int Timer0_count=0;
	TH0=64535/256;//重新初始化
	TL0=64535%256;
	Timer0_count++;
	if(Timer0_count>=1000)//1s
	{
		Timer0_count=0;
		TimeSetFlashFlag=!TimeSetFlashFlag;//闪烁标志位取反
	}
}